<?php
/**
 * xdebug_debug_zval(...$varname) 接受变量名的字符串
 */
//普通标量赋值，zval为常量interned，没有refcount
$s = 'hello';
xdebug_debug_zval('s');


/**表达式或者非标量赋值，zval引用次数refcount=1,应用集合is_ref=0 
*将变量赋值给新变量，不修改变量，两个变量都指向同一个zval，refcount加1，is_ref让然为0，这个叫隐式计数，修改其中变量的值，才会增加新的zval，这个叫做写时赋值**/
//$a = (int)666 . "hell";
$a = rand(0, 999) . "hell";

echo "标量复制<br>";

xdebug_debug_zval('a');

$b = $a;

xdebug_debug_zval('a');

xdebug_debug_zval('b');

$b = 'new';

xdebug_debug_zval('a');

xdebug_debug_zval('b');

unset($a, $b);

echo "数组复制<br>";

$a[] = 1;
xdebug_debug_zval($a);

$b = $a;


xdebug_debug_zval('a');

xdebug_debug_zval('b');

unset($a, $b);



//变量引用，zval引用次数refcount加1,应用集合is_ref=1
echo "<br>引用<br>";

$a = 'hello';

$b = &$a;

xdebug_debug_zval('a');

xdebug_debug_zval('b');

unset($b);
xdebug_debug_zval('a');
xdebug_debug_zval('b');


echo "<br>引用自己<br>";
$arr = ['one'];
$arr[] = &$arr;
xdebug_debug_zval('arr');
unset($arr);
xdebug_debug_zval('arr');
